package com.lcc.gulimall.product;

import com.lcc.common.valid.AddGroup;
import io.seata.spring.annotation.datasource.EnableAutoDataSourceProxy;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 1.整合MyBatis-Plus
 *      1.导入依赖
 *      <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-boot-starter</artifactId>
 *             <version>3.2.0</version>
 *      </dependency>
 *      2.配置
 *        (1)配置数据源
 *          导入驱动
 *          application.yml配置数据源相关信息
 *        (2)配置Mybatis-plus相关信息
 *          @MapperScan("com.lcc.gulimall.product.dao")
 *          告诉MyBatis-plus sql映射文件位置
 * 2.使用Mybatis-plus的逻辑删除
 * (1)配置全局逻辑删除规则（可省略）
 * (2)配置逻辑删除组件Bcan（3.1.8以上高版本可省略）
 * (3)实体类字段上加上@TableLogic注解
 * 3.使用阿里巴巴的OSS服务实现使用云服务器存储文件
 * （1）引入依赖
 * <dependency>
 *   <groupId>com.alibaba.cloud</groupId>
 *   <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
 *   <version>2.2.0.RELEASE</version>
 * </dependency>
 * （2）配置key、endpoint信息
 * （3）使用OSSClient执行相关操作
 * 4.JSR303校验
 *  (1)给Bean添加校验注解：javax.validation.constraints，并定义自己的message提示
 *  (2)开启校验功能@Valid 效果：校验错误后会有默认的校验响应
 *  (3)给校验的bean后紧跟一个BindingResult result，就可以获取到校验的结果
 *  (4)分组校验(多场景的复杂校验)
 *     1)给校验注解标注什么情况需要进行标注
 *      @NotNull(message = "修改必须指定id", groups = {UpdateGroup.class})
 *      注意：分组校验注解要标的话每个字段都标，否则会认为是不起作用的
 *     2)给Controller的方法标上分组
 *     public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){...}
 *     3)默认没有指定分组的校验注解，在分组校验情况下不生效，只会在@Validated生效，就是在没标校验分组的请求中生效
 *  (5)自定义校验
 *     1)编写一个自定义的校验注解  自定义校验注解：public @interface ListValue  存放默认错误信息：ValidationMessages.properties
 *     2)编写一个自定义的校验器  ListValueConstraintValidator
 *     3)关联自定义的校验注解和自定义的校验器
 *         @Constraint(
 *                 validatedBy = {ListValueConstraintValidator.class【可以指定多个不同的校验器，适配不同类型的校验】}
 *         )//自定义校验器
 *         @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
 *         @Retention(RetentionPolicy.RUNTIME)
 *         public @interface ListValue
 * 5.统一异常处理
 * @ControllerAdvice
 *  (1)编写异常处理类，使用@ControllerAdvice
 *  (2)使用@ExceptionHandler标注方法可以处理的异常
 *
 *  6.模板引擎
 *  (1)thymeleaf-starter 关闭缓存
 *  (2)静态资源都放在static文件下可以按照路径直接访问
 *  (3)页面放在templates下，直接访问
 *      Springboot会默认找到index.html打开
 */
@MapperScan("com.lcc.gulimall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
@EnableAutoDataSourceProxy
@EnableFeignClients(basePackages = "com.lcc.gulimall.product.feign")//开启远程调用客户端，basePackages可以写也可以不写
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
